package pe.com.bbva.modpre.ui;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.modpre.dominio.Disponibilidad;
import pe.com.bbva.modpre.dominio.Integrante;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.exception.ValidacionException;
import pe.com.bbva.modpre.negocio.ConfiguracionService;
import pe.com.bbva.modpre.utileria.BeanValidar;
import pe.com.bbva.modpre.utileria.Constante;
import pe.com.bbva.modpre.utileria.Inject;
import pe.com.bbva.modpre.utileria.ModpreUtil;
import pe.com.bbva.modpre.utileria.TablaFiltro;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.terminal.gwt.server.WebApplicationContext;
import com.vaadin.terminal.gwt.server.WebBrowser;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
public class DisponibilidadUI extends CustomComponent implements ClickListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private HorizontalLayout mainLayoutContainer;
	@AutoGenerated
	private VerticalLayout lytDataDisponibilidad;
	@AutoGenerated
	private HorizontalLayout lytBotones;
	@AutoGenerated
	private Button btnEliminar;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private HorizontalLayout lytFechas;
	@AutoGenerated
	private PopupDateField pdfHasta;
	@AutoGenerated
	private PopupDateField pdfDesde;
	@AutoGenerated
	private HorizontalLayout lytData1;
	@AutoGenerated
	private ComboBox cmbUsuario;
	@AutoGenerated
	private TextField txtIdDisponibilidad;
	@AutoGenerated
	private HorizontalLayout lytTablaDisponibilidad;
	@AutoGenerated
	private Panel pnlTablaDisponibilidad;
	@AutoGenerated
	private VerticalLayout lytPanelTablaDisponibilidad;
	@AutoGenerated
	private TablaFiltro tablaFiltroDisponibilidad;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	@Autowired
	ConfiguracionService configuracionService;
	IndexedContainer container = new IndexedContainer();
	
	public DisponibilidadUI() {
		buildMainLayout();
		Inject.inject(this);
		setCompositionRoot(mainLayout);
		postConstruct();
	}
	@Override
	public void attach(){
		super.attach();
		WebApplicationContext context = ((WebApplicationContext) getApplication().getContext());
		WebBrowser webBrowser = context.getBrowser();
		tablaFiltroDisponibilidad.setWebBrowser(webBrowser);
		CargarTablaDisponibilidad();
	}

	public void CargarTablaDisponibilidad() {
		txtIdDisponibilidad.setEnabled(false);
		btnGuardar.setCaption("Crear");
		btnEliminar.setVisible(false);
		container.addContainerProperty("id", String.class, null);
		container.addContainerProperty("item", String.class, null);
		container.addContainerProperty("usuario", String.class,  null);
		container.addContainerProperty("desde", Date.class, null);
		container.addContainerProperty("hasta", Date.class, null);
		container.addContainerProperty("usuarioObjeto", Usuario.class, null);
		
		tablaFiltroDisponibilidad.setContainerDataSource(container);
		
		tablaFiltroDisponibilidad.setVisibleColumns(new Object[]{"item","usuario", "desde", "hasta"});
		tablaFiltroDisponibilidad.setColumnHeader("item", "Item");
		tablaFiltroDisponibilidad.setColumnHeader("usuario", "Usuario");
		tablaFiltroDisponibilidad.setColumnHeader("desde", "Desde");
		tablaFiltroDisponibilidad.setColumnHeader("hasta", "Hasta");
		
		tablaFiltroDisponibilidad.setColumnWidth("item", 20);
		tablaFiltroDisponibilidad.setColumnWidth("usuario", 200);
		tablaFiltroDisponibilidad.setColumnWidth("desde", 85);
		tablaFiltroDisponibilidad.setColumnWidth("hasta", 85);
		tablaFiltroDisponibilidad.setSelectable(true);
		tablaFiltroDisponibilidad.setImmediate(true);
		tablaFiltroDisponibilidad.setNullSelectionAllowed(true);
		tablaFiltroDisponibilidad.setNullSelectionItemId(null);
		tablaFiltroDisponibilidad.setColumnReorderingAllowed(true);
		tablaFiltroDisponibilidad.setColumnCollapsingAllowed(false);
		tablaFiltroDisponibilidad.cargarTabla();
		List<Disponibilidad> listaDis = configuracionService.disponiblesXSuperior(null);
		cargarDatosDisponibilidad(listaDis);
		Listener listener =  new Listener(){

			@Override
			public void componentEvent(Event event) {
				if(tablaFiltroDisponibilidad.getValue() == null){
					limpiarDatosDisponibilidad();
					btnGuardar.setCaption("Crear");
					btnEliminar.setVisible(false);
				}else{
					Item item = tablaFiltroDisponibilidad.getItem(tablaFiltroDisponibilidad.getValue());
					btnGuardar.setCaption("Actualizar");
					btnEliminar.setVisible(true);
					txtIdDisponibilidad.setValue(item.getItemProperty("id").getValue());
					cmbUsuario.setValue(item.getItemProperty("usuarioObjeto").getValue());
					pdfDesde.setValue(item.getItemProperty("desde").getValue());
					pdfHasta.setValue(item.getItemProperty("hasta").getValue());
					
				}
			}

			
			
		};
		tablaFiltroDisponibilidad.addListener(listener);
	}
	private void limpiarDatosDisponibilidad() {
		cmbUsuario.setValue(null);
		txtIdDisponibilidad.setValue("");
		pdfDesde.setValue(null);
		pdfHasta.setValue(null);		
	}
	public void cargarDatosDisponibilidad(List<Disponibilidad> listaDisponibilidad) {
		tablaFiltroDisponibilidad.removeAllItems();
		int con=1;
		for (Disponibilidad disponiblidad : listaDisponibilidad) {
				Item item=container.addItem(con+1);
				item.getItemProperty("id").setValue(disponiblidad.getId());
				item.getItemProperty("item").setValue(con);
				item.getItemProperty("usuario").setValue(disponiblidad.getUsuario().getNombreCompleto());
				item.getItemProperty("desde").setValue(disponiblidad.getFechaDesde());
				item.getItemProperty("hasta").setValue(disponiblidad.getFechaHasta());
				item.getItemProperty("usuarioObjeto").setValue(disponiblidad.getUsuario());
				con++;
				
		}
	}
	public void postConstruct() {
		lytPanelTablaDisponibilidad.setSizeUndefined();
		lytPanelTablaDisponibilidad.setHeight("100%");
		pdfDesde.setDateFormat("dd/MM/yyyy");
		pdfHasta.setDateFormat("dd/MM/yyyy");
		btnGuardar.addListener(this);
		btnEliminar.addListener(this);
		txtIdDisponibilidad.setVisible(false);
		
		cmbUsuario.setInputPrompt("Usuario");
		pdfDesde.setInputPrompt("Fecha Desde");
		pdfHasta.setInputPrompt("Fecha Hasta");
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		List<Integrante> listaItengrante = 	configuracionService.integrantesxEquipoPadre(usuario);
		List<Usuario> listaUsuario= new ArrayList<Usuario>();
		for (Integrante integrante : listaItengrante) {
			listaUsuario.add(integrante.getUsuario());
		}
		
		BeanItemContainer<Usuario> bicUsuarios = new BeanItemContainer<Usuario>(Usuario.class,  listaUsuario);
		cmbUsuario.setContainerDataSource(bicUsuarios);
		cmbUsuario.setItemCaptionPropertyId("nombreCompleto");
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar))
		{
			buttonGuardarDisponibilidad();
		}
		if(event.getButton().equals(btnEliminar))
		{
			buttonEliminarDisponibilidad();
		}
		
	}
	private void buttonEliminarDisponibilidad() {
		configuracionService.eliminarDisponibilidad(Long.parseLong(txtIdDisponibilidad.getValue().toString()));
		btnGuardar.setCaption("Crear");
		List<Disponibilidad> listaDis = configuracionService.disponiblesXSuperior(null);
		cargarDatosDisponibilidad(listaDis);
		limpiarDatosDisponibilidad();
		
	}
	@SuppressWarnings("rawtypes")
	private void buttonGuardarDisponibilidad() {
		Disponibilidad disponibilidad = new Disponibilidad();
		if(!txtIdDisponibilidad.getValue().equals("")){
			disponibilidad.setId(Long.parseLong(txtIdDisponibilidad.getValue().toString()));
		}
		disponibilidad.setUsuario((Usuario)cmbUsuario.getValue());
		disponibilidad.setFechaDesde((Date)(pdfDesde.getValue()));
		disponibilidad.setFechaHasta((Date)(pdfHasta.getValue()));
		
				
		ModpreUtil.validar(getWindow(), disponibilidad, 
				new BeanValidar[]{
					new BeanValidar("usuario", new Object[]{"Usuario"}, cmbUsuario),
					new BeanValidar("fechaDesde", new Object[]{"Fecha Desde"}, pdfDesde),
					new BeanValidar("fechaHasta", new Object[]{"Fecha Hasta"}, pdfHasta)
					});
		
		Calendar fecha=Calendar.getInstance();
		fecha.set(Calendar.HOUR_OF_DAY, 0);
		fecha.set(Calendar.MINUTE, 0);
		fecha.set(Calendar.SECOND, 0);
		int flag =((Date) pdfDesde.getValue()).compareTo(fecha.getTime());
		if(flag==-1){
			throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_RANGOS,new Object[]{"Fechas"});
			
		}else{
			if(((Date) pdfHasta.getValue()).before((Date) pdfDesde.getValue())){
				throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_RANGOS,new Object[]{"Fechas"});
			}
		}
		if((String)txtIdDisponibilidad.getValue()==""){
			for (Iterator i = tablaFiltroDisponibilidad.getItemIds().iterator(); i.hasNext();) {
				int iid = (Integer) i.next();
				Item item = tablaFiltroDisponibilidad.getItem(iid);
				if((((Usuario)item.getItemProperty("usuarioObjeto").getValue()).getId()).equals(((Usuario)cmbUsuario.getValue()).getId())){
					throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_REPETIDO,new Object[]{});
				}
			}	
		}
		configuracionService.guardarDisponibilidad(disponibilidad);
		limpiarDatosDisponibilidad();
		List<Disponibilidad> listaDis = configuracionService.disponiblesXSuperior(null);
		cargarDatosDisponibilidad(listaDis);
		
	}
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// mainLayoutContainer
		mainLayoutContainer = buildMainLayoutContainer();
		mainLayout.addComponent(mainLayoutContainer);
		
		return mainLayout;
	}
	@AutoGenerated
	private HorizontalLayout buildMainLayoutContainer() {
		// common part: create layout
		mainLayoutContainer = new HorizontalLayout();
		mainLayoutContainer.setImmediate(false);
		mainLayoutContainer.setWidth("-1px");
		mainLayoutContainer.setHeight("-1px");
		mainLayoutContainer.setMargin(false);
		mainLayoutContainer.setSpacing(true);
		
		// lytTablaDisponibilidad
		lytTablaDisponibilidad = buildLytTablaDisponibilidad();
		mainLayoutContainer.addComponent(lytTablaDisponibilidad);
		
		// lytDataDisponibilidad
		lytDataDisponibilidad = buildLytDataDisponibilidad();
		mainLayoutContainer.addComponent(lytDataDisponibilidad);
		
		return mainLayoutContainer;
	}
	@AutoGenerated
	private HorizontalLayout buildLytTablaDisponibilidad() {
		// common part: create layout
		lytTablaDisponibilidad = new HorizontalLayout();
		lytTablaDisponibilidad.setImmediate(false);
		lytTablaDisponibilidad.setWidth("-1px");
		lytTablaDisponibilidad.setHeight("-1px");
		lytTablaDisponibilidad.setMargin(false);
		
		// pnlTablaDisponibilidad
		pnlTablaDisponibilidad = buildPnlTablaDisponibilidad();
		lytTablaDisponibilidad.addComponent(pnlTablaDisponibilidad);
		
		return lytTablaDisponibilidad;
	}
	@AutoGenerated
	private Panel buildPnlTablaDisponibilidad() {
		// common part: create layout
		pnlTablaDisponibilidad = new Panel();
		pnlTablaDisponibilidad.setImmediate(false);
		pnlTablaDisponibilidad.setWidth("466px");
		pnlTablaDisponibilidad.setHeight("240px");
		
		// lytPanelTablaDisponibilidad
		lytPanelTablaDisponibilidad = buildLytPanelTablaDisponibilidad();
		pnlTablaDisponibilidad.setContent(lytPanelTablaDisponibilidad);
		
		return pnlTablaDisponibilidad;
	}
	@AutoGenerated
	private VerticalLayout buildLytPanelTablaDisponibilidad() {
		// common part: create layout
		lytPanelTablaDisponibilidad = new VerticalLayout();
		lytPanelTablaDisponibilidad.setImmediate(false);
		lytPanelTablaDisponibilidad.setWidth("100.0%");
		lytPanelTablaDisponibilidad.setHeight("100.0%");
		lytPanelTablaDisponibilidad.setMargin(false);
		
		// tablaFiltroDisponibilidad
		tablaFiltroDisponibilidad = new TablaFiltro(){
			@Override
			public void accion() {
				// TODO Auto-generated method stub
				super.accion();
			}
			@Override
			public void enter() {
				Disponibilidad disponibilidad = new Disponibilidad();
				String validar=(String)tablaFiltroDisponibilidad.obtenerFiltros().get("id");
				if(StringUtils.isNotBlank(validar)){
					if(StringUtils.isNumeric(validar)){
						disponibilidad.setId(Long.parseLong(validar));
					}
				}
				Usuario usuario = new Usuario();
				usuario.setNombres((String)tablaFiltroDisponibilidad.obtenerFiltros().get("usuario"));
				disponibilidad.setUsuario(usuario);
				if((tablaFiltroDisponibilidad.obtenerFiltros().get("desde_1")!=null)){
					disponibilidad.setFechaDesde((Date)tablaFiltroDisponibilidad.obtenerFiltros().get("desde_1"));
				}
				if((tablaFiltroDisponibilidad.obtenerFiltros().get("desde_2")!=null)){
					disponibilidad.setFechaHasta((Date)tablaFiltroDisponibilidad.obtenerFiltros().get("desde_2"));
				}
				if((tablaFiltroDisponibilidad.obtenerFiltros().get("hasta_1")!=null)){
					disponibilidad.setCreacion((Date)tablaFiltroDisponibilidad.obtenerFiltros().get("hasta_1"));
				}
				if((tablaFiltroDisponibilidad.obtenerFiltros().get("hasta_2")!=null)){
					disponibilidad.setEdicion((Date)tablaFiltroDisponibilidad.obtenerFiltros().get("hasta_2"));
				}
				
				tablaFiltroDisponibilidad.removeAllItems();
				List<Disponibilidad> listaDisponibilidadFiltro =configuracionService.disponiblesXSuperior(disponibilidad);
				cargarDatosDisponibilidad(listaDisponibilidadFiltro);
			}
		};
		tablaFiltroDisponibilidad.setImmediate(false);
		tablaFiltroDisponibilidad.setWidth("100.0%");
		tablaFiltroDisponibilidad.setHeight("94.31%");
		lytPanelTablaDisponibilidad.addComponent(tablaFiltroDisponibilidad);
		
		return lytPanelTablaDisponibilidad;
	}
	@AutoGenerated
	private VerticalLayout buildLytDataDisponibilidad() {
		// common part: create layout
		lytDataDisponibilidad = new VerticalLayout();
		lytDataDisponibilidad.setImmediate(false);
		lytDataDisponibilidad.setWidth("-1px");
		lytDataDisponibilidad.setHeight("-1px");
		lytDataDisponibilidad.setMargin(true);
		lytDataDisponibilidad.setSpacing(true);
		
		// lytData1
		lytData1 = buildLytData1();
		lytDataDisponibilidad.addComponent(lytData1);
		
		// lytFechas
		lytFechas = buildLytFechas();
		lytDataDisponibilidad.addComponent(lytFechas);
		lytDataDisponibilidad.setComponentAlignment(lytFechas,
				new Alignment(20));
		
		// lytBotones
		lytBotones = buildLytBotones();
		lytDataDisponibilidad.addComponent(lytBotones);
		lytDataDisponibilidad.setComponentAlignment(lytBotones, new Alignment(
				20));
		
		return lytDataDisponibilidad;
	}
	@AutoGenerated
	private HorizontalLayout buildLytData1() {
		// common part: create layout
		lytData1 = new HorizontalLayout();
		lytData1.setImmediate(false);
		lytData1.setWidth("-1px");
		lytData1.setHeight("-1px");
		lytData1.setMargin(false);
		lytData1.setSpacing(true);
		
		// txtIdDisponibilidad
		txtIdDisponibilidad = new TextField();
		txtIdDisponibilidad.setImmediate(false);
		txtIdDisponibilidad.setWidth("36px");
		txtIdDisponibilidad.setHeight("-1px");
		txtIdDisponibilidad.setInputPrompt("ID");
		lytData1.addComponent(txtIdDisponibilidad);
		
		// cmbUsuario
		cmbUsuario = new ComboBox();
		cmbUsuario.setImmediate(false);
		cmbUsuario.setWidth("248px");
		cmbUsuario.setHeight("-1px");
		lytData1.addComponent(cmbUsuario);
		
		return lytData1;
	}
	@AutoGenerated
	private HorizontalLayout buildLytFechas() {
		// common part: create layout
		lytFechas = new HorizontalLayout();
		lytFechas.setImmediate(false);
		lytFechas.setWidth("288px");
		lytFechas.setHeight("-1px");
		lytFechas.setMargin(false);
		lytFechas.setSpacing(true);
		
		// pdfDesde
		pdfDesde = new PopupDateField();
		pdfDesde.setImmediate(false);
		pdfDesde.setWidth("130px");
		pdfDesde.setHeight("-1px");
		pdfDesde.setResolution(4);
		lytFechas.addComponent(pdfDesde);
		
		// pdfHasta
		pdfHasta = new PopupDateField();
		pdfHasta.setImmediate(false);
		pdfHasta.setWidth("130px");
		pdfHasta.setHeight("-1px");
		pdfHasta.setResolution(4);
		lytFechas.addComponent(pdfHasta);
		lytFechas.setComponentAlignment(pdfHasta, new Alignment(6));
		
		return lytFechas;
	}
	@AutoGenerated
	private HorizontalLayout buildLytBotones() {
		// common part: create layout
		lytBotones = new HorizontalLayout();
		lytBotones.setImmediate(false);
		lytBotones.setWidth("-1px");
		lytBotones.setHeight("-1px");
		lytBotones.setMargin(false);
		lytBotones.setSpacing(true);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Actualizar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytBotones.addComponent(btnGuardar);
		
		// btnEliminar
		btnEliminar = new Button();
		btnEliminar.setCaption("Eliminar");
		btnEliminar.setImmediate(true);
		btnEliminar.setWidth("-1px");
		btnEliminar.setHeight("-1px");
		lytBotones.addComponent(btnEliminar);
		
		return lytBotones;
	}

}
